/* @flow */

import {parse} from './parser/index'
import {optimize} from './optimizer'
import {generate} from './codegen/index'
import {createCompilerCreator} from './create-compiler'

// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
export const createCompiler = createCompilerCreator(function baseCompile(
  template: string,
  options: CompilerOptions
): CompiledResult {
  // 1. 词法分析，通过解析模板生成 AST
  const ast = parse(template.trim(), options)
  // 2. 优化过程，标记静态节点
  if (options.optimize !== false) {
    optimize(ast, options)
  }

  // 3. 通过 AST 和 options 生成渲染函数
  const code = generate(ast, options)
  return {
    ast,
    render: code.render,
    staticRenderFns: code.staticRenderFns
  }
})
